# -*- encoding:utf-8 -*-
# @time:2022-11-07 21:04
# @Author : serein
# @Email: serein@qq.com
# @File:serializers.py
# @Software: PyCharm



from rest_framework import serializers
from .models import Student,Teacher,Classes

# read_only=True只读 label在这里是在前端展示出来的样子 required=False是可不传入数据的意思
# class Studentserializers(serializers.Serializer):
#     id = serializers.CharField(label='ID',read_only=True)
#     name = serializers.CharField(label='姓名',max_length=30)
#     age = serializers.IntegerField(label='年龄',required=False)
#     sex = serializers.IntegerField(label='性别',required=False)
#     create_time = serializers.DateTimeField(required=False,label='创建时间')
#     update_time = serializers.DateTimeField(required=False,label='更改时间')
#     is_delete = serializers.BooleanField(default=False,label='逻辑删除',required=False)
#
#     def create(self, validated_data):
#         return Student.objects.create(**validated_data)
#     def update(self, instance, validated_data):
#         #数据修改
#         #validated_data.get('name',instance.name)此处表示如果有数据修改就更改，如果没有就按原数据
#         instance.name = validated_data.get('name',instance.name)
#         instance.age = validated_data.get('age',instance.age)
#         instance.sex = validated_data.get('sex',instance.sex)
#         instance.save()
#         return instance


class Studentserializers(serializers.ModelSerializer):
    # classes = serializers.StringRelatedField(label='班级')
    #重写输出字段，原本输出的是classes.id，现在输出的是classes，model里面__str__要输出的字段
    #但是用重写方法的话，会让学生的create页面找不到班级选项，因为班级选项是通过id来找寻的，现在把id改变了所以找不到

    #现在想要多加一个字段来实现学生页面展示出班级的名称
    class_name = serializers.CharField(source='classes.name',read_only=True)
    #source就是通过外键正向查询的结果

    class Meta:
        model = Student
        exclude = ['is_delete']

class StudentserializersMin(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ['id','name','age','sex']


class Classesserializers(serializers.ModelSerializer):
    # student_set = Studentserializers(many=True,read_only=True)
    #这里是反向查询操作，反向查询首字母会变成小写，然后后面的关联表也应该是用一张
    #student_set这不是随便定义的变量是数据库关联表来定义的变量
    #此处查询出来的是学生表所有的数据我们不想要那么多数据，所以要重写弄一个序列化器
    student_set = StudentserializersMin(many=True,read_only=True)
    class Meta:
        model = Classes
        exclude = ['is_delete']


class Teacherserializers(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        #fileds（显示所有字段） 与 exclude（除了括号里面的全部字段） 相冲不能同时使用
        # fields = '__all__'
        exclude = ['is_delete']
        #使用序列化器对属性进行一些逻辑判断
        extra_kwargs = {
            'age' : {'min_value':0,'max_value':100}
        }
    #增加额外的校验逻辑
    # def validate_name(self,value):
    #     #增加额外的校验 属性级别的 validata 加上_要校验的字段
    #     if 'zhs' not in value.lower():
    #         raise serializers.ValidationError('名字中没有zhs')
    #     return value
    # def validate(self, attrs):
    #     # 增加额外的逻辑校验 对象级别的 会把所有数据传入attrs中，attrs={'name':'xx',age:19}
    #     if 'zhs' not in attrs['name'].lower():
    #         raise serializers.ValidationError('名字中没有zhs')
    #     elif attrs['age']<18:
    #         raise serializers.ValidationError('未成名不可以登入')
    #     return attrs
    #



